package main

import (
	"encoding/binary"
	"fmt"
	"unsafe"
)

func main() {
	if IsLittleEndian() {
		fmt.Println("当前CPU体系是小端")
	} else {
		fmt.Println("当前CPU体系是大端")
	}
	var val uint32 = 1
	bytes := make([]byte, 4)
	binary.BigEndian.PutUint32(bytes, val)
	fmt.Println("转换成大端后 ", bytes)
	fmt.Println("大端字节序使用大端输出结果：", binary.BigEndian.Uint32(bytes))
	fmt.Println("大端字节序使用小端输出结果：", binary.LittleEndian.Uint32(bytes))

	binary.LittleEndian.PutUint32(bytes, val)
	fmt.Println("转换成小端后 ", bytes)
	fmt.Println("小端字节序使用大端输出结果：", binary.BigEndian.Uint32(bytes))
	fmt.Println("小端字节序使用小端输出结果：", binary.LittleEndian.Uint32(bytes))
}

func IsLittleEndian() bool {
	//int32四个字节 值为1
	//二进制是 00000000 00000000 00000000 00000001
	//十六进制 0x00 0x00 0x00 0x01
	//小端（高位字节在内存高地址，低位字节在内存低地址）
	//结果（16进制） 0x01 0x00 0x00 0x00
	//大端（高位字节在内存低地址，低位字节在内存高地址）
	//结果（16进制） 0x00 0x00 0x00 0x01
	var val int32 = 1
	fmt.Println(&val)
	//先转换为通用指针，获取首地址(内存低地址），然后再将首地址转换为*byte指针，最后再取值
	pointer := unsafe.Pointer(&val)
	tmp := (*byte)(pointer)
	if *tmp != 1 {
		return false
	}
	return true
}
